siedler_aekfandomcom_de-20200214-history
SetupInteractiveObject
Normaler Weise haben Interaktive Objekte immer ihr Handsymbol und es steht immer der selbe vordefinierte Text da. In DIE SIEDLER - Reich des Ostens kommen Handelsposten und auffüllbare Minen hinzu. Aber wie wäre es, wenn man den Text des Tooltip und das Bild auf dem Button selbst bestimmen könnte? Das wird nun möglich sein. Texte und Button verändern Alles was ein Interaktives Objekt benötigt ist einen Skriptnamen und ein Setup mit LordsTreasureDeliver oder MachSchatzTausch. Um Text und Bild zu verändern wird diese Funktion verwendet: SetupIO(_eName,_icon,_title,_text) Argumente Anwendungsbeispiel SetupIO("weltenbaum",{16, 4,},"Beschenken","So wie es Sitte ist, sollt auch Ihr dem Adler ein Geschenk darbringen.") Beliebiger Entity einen Schalter zuordnen Neben dem ändern der Schalter und der Beschreibung ermöglicht der Code auch ein beliebiges Objekt mit einem Schalter auszustatten. Alles was dafür benötigt wird, ist ein Skriptname. Zur Zeit ist es leider nicht möglich diesen Objekten Kosten zuzuweisen. Stellen wir uns folgendes Szenario vor: Hakim buddelt auf einem Friedhof nach einer versteckten Schatztruhe. Man nehme eine Entities.XD_ScriptEntity und gebe ihr einen eindeutigen Skriptnamen. Nun wollen wir, das ein Schalter erscheint, mit dem der Spieler etwas auslösen kann. Zum Beispiel ein Briefing. Funktion local t = { Name = "graben", Button = {6,4,1,}, Description = { Title = Umlaute("Schatzversteck"), Text = Umlaute("Hier wurde ein Schatz versteckt. Last Hakim danach graben."), }, ShowDistance = 500, Action = function(_IO) GUI.SendScriptCommand("BriefingGraben()") end, } SetupInteractiveObject(t) Erläuterung Funktionen für das globale Skript Da sich alle Aktionen in der lokalen Skriptumgebung befinden, müssen Funktionen, die nur in der globalen Umgebung vorhanden sind an das globale Skript gesendet werden. Das betrifft fast alle Funktionen also kommst du besser, wenn du dir gleich eine Refferenz in das globale Skript erstellst. Dazu gest du wie folgt vor: #Erstelle deine Funktion im globalen Skript #Schreibe GUI.SendScriptCommand("") in die Action des Objektes #Trage zwischen die "" den Funktionsnamen deiner Funktion ein Funktionscode Diese Funktionen müssen einmalig in der lokalen '''Skriptumgebung vorkommen. -- INTERAKTIVE OBJEKTE -------------------------------------------------------------------- -- Version 5. 2013 ------------------------------------------------------------------------ function SetupIO(_eName,_button,_title,_text) assert(IsExisting(_eName),"LUA ERRRUN SetupIO : IO dosen't exist on the map.") if _text nil then _text = "Interaktion möglich." end if _title nil then _title = "Interaktives Objekt" end if _button nil then _button = {14, 10} end local t = { Name = _eName, Button = _button, Description = { Title = Umlaute(_title), Text = Umlaute(_text), }, } SetupInteractiveObject(t) end function SetupInteractiveObject(_table) g_Interaction.ActiveObjectsOnScreen = g_Interaction.ActiveObjectsOnScreen or {} TWA_IO = TWA_IO or {} if not _table.Button then _table.Button = {14, 10} end table.insert( TWA_IO, _table ) if not IO_Init then ControlInteractiveObjectIconAndDescription() IO_Init = true end end function ControlInteractiveObjectIconAndDescription() GUI_Interaction.InteractiveObjectUpdate_OrigTWA_IO = GUI_Interaction.InteractiveObjectUpdate GUI_Interaction.InteractiveObjectUpdate = function() GUI_Interaction.InteractiveObjectUpdate_OrigTWA_IO() for i=1, #TWA_IO do local eType = Logic.GetEntityType(GetEntityId(TWA_IOi.Name)) local eTypeName = Logic.GetEntityTypeName(eType) for j=1, #g_Interaction.ActiveObjectsOnScreen do local path = "/InGame/Root/Normal/InteractiveObjects/"..j if XGUIEng.IsWidgetExisting(path) 1 then local objectID = g_Interaction.ActiveObjectsOnScreenj local entityName = Logic.GetEntityName(objectID) if TWA_IOi.Name entityName then SetIcon(path,TWA_IOi.Button) end end end if TWA_IOi.ShowDistance ~= nil and not(string.find(eTypeName,"I_X_"))then local pos = GetPosition(TWA_IOi.Name) local entities = {Logic.GetPlayerEntitiesInArea(1,0,pos.X,pos.Y,TWA_IOi.ShowDistance,16)} local found = false if entities1 > 0 then for k=1,#entities do if Logic.IsEntityInCategory(entitiesk,EntityCategories.Hero) 1 then found = true end end end if found and not TWA_IOi.CustomIOUsed then ScriptCallback_ObjectInteraction(1,GetEntityId(TWA_IOi.Name)) else ScriptCallback_CloseObjectInteraction(1,GetEntityId(TWA_IOi.Name)) end else if not TWA_IOi.CustomIOUsed then ScriptCallback_ObjectInteraction(1,GetEntityId(TWA_IOi.Name)) else ScriptCallback_CloseObjectInteraction(1,GetEntityId(TWA_IOi.Name)) end end end end GUI_Tooltip.SetNameAndDescription_OrigTWA_IO = GUI_Tooltip.SetNameAndDescription GUI_Tooltip.SetNameAndDescription = function(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean) if XGUIEng.GetWidgetPathByID(XGUIEng.GetCurrentWidgetID()) "/InGame/Root/Normal/InteractiveObjects/1" or XGUIEng.GetWidgetPathByID(XGUIEng.GetCurrentWidgetID()) "/InGame/Root/Normal/InteractiveObjects/2" then GUI_Tooltip.SetNameAndDescription_OrigTWA_IO(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean) local number = tonumber(XGUIEng.GetWidgetNameByID(XGUIEng.GetCurrentWidgetID())) local objectID = g_Interaction.ActiveObjectsOnScreennumber for i=1, #TWA_IO do if objectID GetEntityId(TWA_IOi.Name)then XGUIEng.SetText(_TooltipNameWidget, "{center}"..TWA_IOi.Description.Title) XGUIEng.SetText(_TooltipDescriptionWidget, ""..TWA_IOi.Description.Text) local TTH = XGUIEng.GetTextHeight(_TooltipDescriptionWidget, true) local W, H = XGUIEng.GetWidgetSize(_TooltipDescriptionWidget) XGUIEng.SetWidgetSize(_TooltipDescriptionWidget, W, TTH) end end else GUI_Tooltip.SetNameAndDescription_OrigTWA_IO(_TooltipNameWidget, _TooltipDescriptionWidget, _OptionalTextKeyName, _OptionalDisabledTextKeyName, _OptionalMissionTextFileBoolean) end end GUI_Interaction.InteractiveObjectClicked_Orig = GUI_Interaction.InteractiveObjectClicked GUI_Interaction.InteractiveObjectClicked = function() GUI_Interaction.InteractiveObjectClicked_Orig() local i = tonumber(XGUIEng.GetWidgetNameByID(XGUIEng.GetCurrentWidgetID())) local eID = g_Interaction.ActiveObjectsOnScreeni for i=1, #TWA_IO do if TWA_IOi.Action ~= nil then if eID GetEntityId(TWA_IOi.Name)then if TWA_IOi.SingleUse ~= false then TWA_IOi.CustomIOUsed = true end TWA_IOi.Action(TWA_IOi) end end end end end Außerdem wird - sofern nicht schon vorhanden - die Umlaute-Funktion benötigt. Wenn du den Briefing-Code von Old MacDonald und/oder das NEP in deiner Map benutzt, ist diese Funktion automatisch enthalten. Wichtig Es gibt nur zwei Plätze für Interaktive Objekte. Achte '''stets darauf, dass es im Bildschirmausschnitt maximal zwei aktivierte interaktive Objekte gibt. Zusätzliche Objekte können erst angezeigt werden, wenn einer der beiden Slots frei wird. Gibt es mehr als zwei aktive Objekte im Bildausschnitt wird normaler Weise eine Fehlermeldung ausgegeben, wenn DisplayScriptError aktiv ist.